# AI 기반 실시간 설비 상태 모니터링 및 LED 제어 기획안

이 기획안은 NILM(전력 계측) 에이전트가 수집하는 실시간 전기 데이터를 LLM으로 분석하여 설비의 가동/미가동/에러 상태를 판별하고, 그 결과에 따라 경광등(LED)을 자동 제어하는 기능에 대한 설계입니다.

## 🚨 User Review Required (중요 고려사항)
LLM(Mistral)은 텍스트 분석 및 추론에 특화되어 있으나, 응답을 생성하는 데 시간(수 초~수십 초)이 소요되며 시스템 리소스를 많이 차지합니다. 
NILM 데이터가 1초 단위로 들어오는데 **매초 LLM에 질의하는 것은 성능상 불가능**합니다. 따라서 데이터를 어떻게 모아서 LLM에 전달할 것인지에 대한 설계가 가장 중요합니다.

## ❓ Open Questions (결정 필요 사항)
1. **LLM 질의 주기 및 조건**: 
   - 일정 시간마다 질의? (예: 1분마다 평균값을 계산하여 질의)
   - 변화량 기반 질의? (예: 전력량이 이전 대비 20% 이상 급변했을 때만 질의)
   - *(추천)* 전력량의 유의미한 변동(예: 1kW 이상 변동)이 발생했을 때만 백엔드로 전송하여 LLM 분석을 요청하는 것이 효율적입니다.
2. **기준값(Threshold) 제공 방식**: 
   - LLM이 에러나 가동 상태를 판단하려면 기준점이 필요합니다. (예: 대기전력 100W, 정상가동 2000W)
   - DB에 저장된 `nilm_init_value`(초기 기준값)를 LLM 프롬프트에 같이 제공하여 스스로 비교 판단하게 할까요?
3. **LED 제어 주체**:
   - 기존에 설계된 방식처럼, LLM 분석 완료 후 백엔드가 DB의 **`target_status`** 만 변경해두면, 기존 경광등 에어전트(또는 현재 에이전트)가 이를 감지하여 LED 색상을 바꾸는(Handshake) 방식을 유지하는 것이 좋겠습니다. 동의하시나요?

---

## 🛠️ Proposed Changes (제안하는 시스템 흐름)

### 1. 흐름도 (Architecture Flow)
1. **NILM 데이터 수집**: 델파이 NILM Agent가 센서로부터 데이터를 수신.
2. **상태 변경 감지 (델파이)**: 수신된 전력값이 기존 상태(이전 판단 시점)와 비교하여 큰 폭의 변동이 있을 경우, 백엔드 API로 데이터 전송.
3. **상태 분석 (Python FastAPI + Mistral)**:  // Ollama+LLm 으로 변경
   - 백엔드는 "현재 전력: 150W, 정상 가동 기준: 2000W. 현재 상태를 '가동(GREEN)', '미가동(YELLOW)', '에러(RED)' 중 하나로 판별하라"는 프롬프트를 생성하여 LLM에 질의.
4. **목표 상태 갱신 (DB)**: LLM이 "YELLOW"라고 답변하면, 백엔드가 `sensor_info`의 해당 설비 `target_ch*_statusID`를 YELLOW 상태로 업데이트.
5. **LED 제어 적용**: LED 제어 에이전트가 목표 상태를 감지하고 실제 하드웨어 경광등 색상을 변경.

### 2. 컴포넌트별 상세 수정 계획

#### [MODIFY] 백엔드 API (`backend/main.py`)
- **신규 API 추가**: `POST /api/analyze_power`
- **Request**: `{ "machine_id": "dev1", "voltage": 220, "current": 0.6, "power": 132 }`
- **로직**:
  1. DB에서 해당 설비의 `nilm_init_value` (정상 가동 기준 전력) 조회.
  2. Mistral LLM 프롬프트 구성 및 추론 요청.
  3. LLM 결과(RED/YELLOW/GREEN) 파싱 후 `sensor_info`의 `target_status` 업데이트 및 `event_log` 에 로그 기록.
  4. Response 반환 (`{"reply": "[AI 판단] 미가동 상태로 전환되었습니다. (YELLOW)"}`)

#### [MODIFY] NILM 에이전트 (`agents/delphi_nilm_agent/uMain.pas`)
- **HTTP 클라이언트 모듈 추가**: `TNetHTTPClient` 또는 `TIdHTTP` 컴포넌트를 사용하여 REST API 호출 기능 추가.
- **분석 요청 로직 (Threshold Logic)**:
  - 매번 들어오는 데이터를 전부 백엔드에 쏘지 않도록 필터링 로직 구현.
  - 예: 최근 5초 평균값을 구한 뒤, 이전 상태의 전력값과 비교하여 오차범위(예: ±10%)를 벗어나는 급격한 변화가 감지될 때만 `/api/analyze_power` API를 비동기(Thread)로 호출.
  - UI에 `[AI 상태 분석 중...]` 로그 출력 추가.

---

## ✅ Verification Plan (검증 계획)
1. **임계값 테스트**: NILM 센서에서 임의로 전류 값을 0으로 떨어뜨리거나, 비정상적으로 높은 값을 보냈을 때 델파이 에이전트가 이를 감지하고 API를 호출하는지 확인.
2. **LLM 추론 테스트**: FastAPI 백엔드 단독으로 전력 데이터를 넣었을 때 Mistral 모델이 RED, YELLOW, GREEN 중 하나를 정확히 내뱉는지 프롬프트 튜닝 및 확인.
3. **End-to-End 동작**: NILM 데이터 수신 -> LLM 추론 -> DB 갱신 -> 로그 기록의 전체 사이클 확인.
